package com.wang.springframework.beans.factory;

import com.wang.springframework.beans.BeansException;

/**
 * @author wangjianhua
 * @Description
 * @date 2021/8/24/024 18:07
 **/
public interface BeanFactory {

    /**
     * 获取bean
     * @param name 名字
     * @return bean
     * @throws BeansException BeansException
     */
    Object getBean(String name) throws BeansException;


    /**
     * 获取bean
     * @param name 名字
     * @param args 参数
     * @return bean
     * @throws BeansException BeansException
     */
    Object getBean(String name, Object... args) throws BeansException;

    /**
     * 提供class类型 从而转换bean类型 不用再手动转换
     * @param name 名称
     * @param requiredType 需要转换的class类型
     * @param <T> 泛型
     * @return bean
     * @throws BeansException 异常
     */
    <T> T getBean(String name, Class<T> requiredType) throws BeansException;

    /**
     * 提供class以获取该class对应的bean
     * @param requiredType class
     * @param <T> 泛型
     * @return bean
     * @throws BeansException 异常
     */
    <T> T getBean(Class<T> requiredType) throws BeansException;

    /**
     *这个bean工厂包含bean定义还是外部注册的单例还是使用给定名称的实例？
     *如果给定的名称是别名，它将被翻译回相应的规范bean名称。
     *<如果这个工厂是分层的，那么如果bean不能在此工厂实例中找到，将询问任何父工厂
     *如果找到与给定名称匹配的bean定义或单例实例，无论命名的bean定义是否具体，该方法都将返回{@code true}
     *或abstract, lazy or eager，scope or not。因此，请注意{@code true}
     *此方法的返回值不一定表示 {@link #getBean}
     *将能够获取同名的实例。
     *@param name 要查询的bean的名称
     *@return 是否存在具有给定名称的bean
     */
    boolean containsBean(String name);
}
